🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / settings / src / commonTest / kotlin / org / meshtastic / feature / settings / SettingsViewModelTest.kt
Displaying Raw • Download
feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/SettingsViewModelTest.kt f4506450168d047b225b277620bf0f1d5dcd13b5 (f4506450) Text, 14.21 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.settings
Tff7b72import T7ee787app.cash.turbine.test
Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.answering.calls
Tff7b72import T7ee787dev.mokkery.answering.returns
Tff7b72import T7ee787dev.mokkery.every
Tff7b72import T7ee787dev.mokkery.everySuspend
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verifySuspend
Tff7b72import T7ee787io.kotest.matchers.ints.shouldBeInRange
Tff7b72import T7ee787io.kotest.matchers.shouldBe
Tff7b72import T7ee787io.kotest.property.Arb
Tff7b72import T7ee787io.kotest.property.arbitrary.int
Tff7b72import T7ee787io.kotest.property.checkAll
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.ExperimentalCoroutinesApi
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.flowOf
Tff7b72import T7ee787kotlinx.coroutines.test.UnconfinedTestDispatcher
Tff7b72import T7ee787kotlinx.coroutines.test.resetMain
Tff7b72import T7ee787kotlinx.coroutines.test.runCurrent
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787kotlinx.coroutines.test.setMain
Tff7b72import T7ee787okio.Buffer
Tff7b72import T7ee787okio.BufferedSink
Tff7b72import T7ee787okio.ByteString.Companion.encodeUtf8
Tff7b72import T7ee787org.meshtastic.core.common.BuildConfigProvider
Tff7b72import T7ee787org.meshtastic.core.common.state.HiddenFeaturesUnlock
Tff7b72import T7ee787org.meshtastic.core.common.util.CommonUri
Tff7b72import T7ee787org.meshtastic.core.domain.usecase.settings.ExportDataUseCase
Tff7b72import T7ee787org.meshtastic.core.domain.usecase.settings.ExportNodeDatabaseUseCase
Tff7b72import T7ee787org.meshtastic.core.domain.usecase.settings.IsOtaCapableUseCase
Tff7b72import T7ee787org.meshtastic.core.domain.usecase.settings.SetMeshLogSettingsUseCase
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.model.MeshLog
Tff7b72import T7ee787org.meshtastic.core.repository.FileService
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeAppPreferences
Tff7b72import T7ee787org.meshtastic.core.testing.FakeDatabaseManager
Tff7b72import T7ee787org.meshtastic.core.testing.FakeMeshLogRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeNodeRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeNotificationPrefs
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioController
Tff7b72import T7ee787org.meshtastic.core.testing.TestDataFactory
Tff7b72import T7ee787org.meshtastic.proto.Data
Tff7b72import T7ee787org.meshtastic.proto.FromRadio
Tff7b72import T7ee787org.meshtastic.proto.LocalConfig
Tff7b72import T7ee787org.meshtastic.proto.MeshPacket
Tff7b72import T7ee787org.meshtastic.proto.PortNum
Tff7b72import T7ee787kotlin.test.AfterTest
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertNotNull
Tff7b72import T7ee787kotlin.test.assertTrue
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalCoroutinesApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72class T56d364SettingsViewModelTest Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3testDispatcher Tff7b72= Te6edf3UnconfinedTestDispatcherTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3viewModelTb4b4b4: Te6edf3SettingsViewModel
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3nodeRepositoryTb4b4b4: Te6edf3FakeNodeRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3radioControllerTb4b4b4: Te6edf3FakeRadioController
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3appPreferencesTb4b4b4: Te6edf3FakeAppPreferences
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3meshLogRepositoryTb4b4b4: Te6edf3FakeMeshLogRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3databaseManagerTb4b4b4: Te6edf3FakeDatabaseManager
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3notificationPrefsTb4b4b4: Te6edf3FakeNotificationPrefs
Tff7b72private Tff7b72val Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3buildConfigProviderTb4b4b4: Te6edf3BuildConfigProvider Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3fileServiceTb4b4b4: Te6edf3FileService Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3DispatchersTb4b4b4.Te6edf3setMainTb4b4b4(Te6edf3testDispatcherTb4b4b4)
Te6edf3nodeRepository Tff7b72= Te6edf3FakeNodeRepositoryTb4b4b4(Tb4b4b4)
Te6edf3radioController Tff7b72= Te6edf3FakeRadioControllerTb4b4b4(Tb4b4b4)
Te6edf3appPreferences Tff7b72= Te6edf3FakeAppPreferencesTb4b4b4(Tb4b4b4)
Te6edf3meshLogRepository Tff7b72= Te6edf3FakeMeshLogRepositoryTb4b4b4(Tb4b4b4)
Te6edf3databaseManager Tff7b72= Te6edf3FakeDatabaseManagerTb4b4b4(Tb4b4b4)
Te6edf3notificationPrefs Tff7b72= Te6edf3FakeNotificationPrefsTb4b4b4(Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3localConfigFlow Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3LocalConfigTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3buildConfigProviderTb4b4b4.Te6edf3versionName Tb4b4b4} Te6edf3returns Ta5d6ff"Ta5d6ff3.0.0-testTa5d6ff"
Tff7b72val Te6edf3isOtaCapableUseCaseTb4b4b4: Te6edf3IsOtaCapableUseCase Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3isOtaCapableUseCaseTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3flowOfTb4b4b4(Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3uiPrefs Tff7b72= Te6edf3appPreferencesTb4b4b4.Te6edf3ui
Tff7b72val Te6edf3setMeshLogSettingsUseCase Tff7b72= Te6edf3SetMeshLogSettingsUseCaseTb4b4b4(Te6edf3meshLogRepositoryTb4b4b4, Te6edf3appPreferencesTb4b4b4.Te6edf3meshLogTb4b4b4)
Tff7b72val Te6edf3exportDataUseCase Tff7b72= Te6edf3ExportDataUseCaseTb4b4b4(Te6edf3nodeRepositoryTb4b4b4, Te6edf3meshLogRepositoryTb4b4b4)
Tff7b72val Te6edf3exportNodeDatabaseUseCase Tff7b72= Te6edf3ExportNodeDatabaseUseCaseTb4b4b4(Te6edf3nodeRepositoryTb4b4b4)
Te6edf3viewModel Tff7b72=
Te6edf3SettingsViewModelTb4b4b4(
Te6edf3radioConfigRepository Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4,
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3nodeRepository Tff7b72= Te6edf3nodeRepositoryTb4b4b4,
Te6edf3uiPrefs Tff7b72= Te6edf3uiPrefsTb4b4b4,
Te6edf3buildConfigProvider Tff7b72= Te6edf3buildConfigProviderTb4b4b4,
Te6edf3databaseManager Tff7b72= Te6edf3databaseManagerTb4b4b4,
Te6edf3meshLogPrefs Tff7b72= Te6edf3appPreferencesTb4b4b4.Te6edf3meshLogTb4b4b4,
Te6edf3notificationPrefs Tff7b72= Te6edf3notificationPrefsTb4b4b4,
Te6edf3setMeshLogSettingsUseCase Tff7b72= Te6edf3setMeshLogSettingsUseCaseTb4b4b4,
Te6edf3exportDataUseCase Tff7b72= Te6edf3exportDataUseCaseTb4b4b4,
Te6edf3exportNodeDatabaseUseCase Tff7b72= Te6edf3exportNodeDatabaseUseCaseTb4b4b4,
Te6edf3isOtaCapableUseCase Tff7b72= Te6edf3isOtaCapableUseCaseTb4b4b4,
Te6edf3fileService Tff7b72= Te6edf3fileServiceTb4b4b4,
Te6edf3hiddenFeaturesUnlock Tff7b72= Te6edf3HiddenFeaturesUnlockTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@AfterTest
Tff7b72fun Td2a8fftearDownTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3DispatchersTb4b4b4.Te6edf3resetMainTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fftestInitializationTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertNotNullTb4b4b4(Te6edf3viewModelTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ff3.0.0-testTa5d6ff"Tb4b4b4, Te6edf3viewModelTb4b4b4.Te6edf3appVersionNameTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`isConnected flow emits updates using Turbine`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3isConnectedTb4b4b4.Te6edf3test Tb4b4b4{
Te6edf3expectMostRecentItemTb4b4b4(Tb4b4b4) Te6edf3shouldBe Tff7b72false T8b949e// Default in FakeRadioController is Disconnected
Te6edf3radioControllerTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3expectMostRecentItemTb4b4b4(Tb4b4b4) Te6edf3shouldBe Tff7b72true
Te6edf3radioControllerTb4b4b4.Te6edf3setConnectionStateTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3expectMostRecentItemTb4b4b4(Tb4b4b4) Te6edf3shouldBe Tff7b72false
Te6edf3cancelAndIgnoreRemainingEventsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`isOtaCapable flow works`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3isOtaCapableTb4b4b4.Te6edf3test Tb4b4b4{
Te6edf3expectMostRecentItemTb4b4b4(Tb4b4b4) Te6edf3shouldBe Tff7b72true
Te6edf3cancelAndIgnoreRemainingEventsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`notification settings update prefs`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3setMessagesEnabledTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3notificationPrefsTb4b4b4.Te6edf3messagesEnabledTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3setNodeEventsEnabledTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3notificationPrefsTb4b4b4.Te6edf3nodeEventsEnabledTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3setLowBatteryEnabledTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3notificationPrefsTb4b4b4.Te6edf3lowBatteryEnabledTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`mesh log logging setting updates prefs`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3setMeshLogLoggingEnabledTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3meshLogTb4b4b4.Te6edf3loggingEnabledTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3setMeshLogLoggingEnabledTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3meshLogTb4b4b4.Te6edf3loggingEnabledTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72true
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`unlockHiddenFeatures updates state`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3hiddenFeaturesUnlockedTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3unlockHiddenFeaturesTb4b4b4(Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3hiddenFeaturesUnlockedTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72true
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`provideLocation flows based on current node`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3myNodeNum Tff7b72= T79c0ff4T79c0ff5T79c0ff6
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setMyNodeInfoTb4b4b4(Te6edf3TestDataFactoryTb4b4b4.Te6edf3createMyNodeInfoTb4b4b4(Te6edf3myNodeNum Tff7b72= Te6edf3myNodeNumTb4b4b4)Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3provideLocationTb4b4b4.Te6edf3test Tb4b4b4{
Te6edf3expectMostRecentItemTb4b4b4(Tb4b4b4) Te6edf3shouldBe Tff7b72true T8b949e// Default in FakeUiPrefs is true
Te6edf3appPreferencesTb4b4b4.Te6edf3uiTb4b4b4.Te6edf3setShouldProvideNodeLocationTb4b4b4(Te6edf3myNodeNumTb4b4b4, Tff7b72falseTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3expectMostRecentItemTb4b4b4(Tb4b4b4) Te6edf3shouldBe Tff7b72false
Te6edf3cancelAndIgnoreRemainingEventsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`startProvidingLocation and stopProvidingLocation delegate to RadioController`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3startProvidingLocationTb4b4b4(Tb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3startProvideLocationCalled Te6edf3shouldBe Tff7b72true
Te6edf3viewModelTb4b4b4.Te6edf3stopProvidingLocationTb4b4b4(Tb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3stopProvideLocationCalled Te6edf3shouldBe Tff7b72true
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`test property based bounds for mesh log retention days`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3checkAllTb4b4b4(Te6edf3ArbTb4b4b4.Te6edf3intTb4b4b4(Tff7b72-T79c0ff1T79c0ff0T79c0ff0Tb4b4b4, T79c0ff5T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3input Tff7b72-Tff7b72>
Te6edf3viewModelTb4b4b4.Te6edf3setMeshLogRetentionDaysTb4b4b4(Te6edf3inputTb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3meshLogRetentionDaysTb4b4b4.Te6edf3value Te6edf3shouldBeInRange Tff7b72-T79c0ff1.Tb4b4b4.T79c0ff3T79c0ff6T79c0ff5
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setTheme updates prefs`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3setThemeTb4b4b4(T79c0ff2Tb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3uiTb4b4b4.Te6edf3themeTb4b4b4.Te6edf3value Te6edf3shouldBe T79c0ff2
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setShowFullMessageTimestamps updates prefs`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3setShowFullMessageTimestampsTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3uiTb4b4b4.Te6edf3showFullMessageTimestampsTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72true
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setLocale updates prefs`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3setLocaleTb4b4b4(Ta5d6ff"Ta5d6fffrTa5d6ff"Tb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3uiTb4b4b4.Te6edf3localeTb4b4b4.Te6edf3value Te6edf3shouldBe Ta5d6ff"Ta5d6fffrTa5d6ff"
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`showAppIntro updates prefs`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3showAppIntroTb4b4b4(Tb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3uiTb4b4b4.Te6edf3appIntroCompletedTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setProvideLocation updates prefs for current node`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setMyNodeInfoTb4b4b4(Te6edf3TestDataFactoryTb4b4b4.Te6edf3createMyNodeInfoTb4b4b4(Te6edf3myNodeNum Tff7b72= Te6edf3myNodeNumTb4b4b4)Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3setProvideLocationTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3uiTb4b4b4.Te6edf3shouldProvideNodeLocationTb4b4b4(Te6edf3myNodeNumTb4b4b4)Tb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72true
Te6edf3viewModelTb4b4b4.Te6edf3setProvideLocationTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3uiTb4b4b4.Te6edf3shouldProvideNodeLocationTb4b4b4(Te6edf3myNodeNumTb4b4b4)Tb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`saveDataCsv writes filtered export via file service`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3myNodeNum Tff7b72= T79c0ff4T79c0ff5T79c0ff6
Tff7b72val Te6edf3senderNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setMyNodeInfoTb4b4b4(Te6edf3TestDataFactoryTb4b4b4.Te6edf3createMyNodeInfoTb4b4b4(Te6edf3myNodeNum Tff7b72= Te6edf3myNodeNumTb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setNodesTb4b4b4(
Te6edf3listOfTb4b4b4(Te6edf3TestDataFactoryTb4b4b4.Te6edf3createTestNodeTb4b4b4(Te6edf3num Tff7b72= Te6edf3senderNodeNumTb4b4b4, Te6edf3longName Tff7b72= Ta5d6ff"Ta5d6ffSender NodeTa5d6ff"Tb4b4b4, Te6edf3shortName Tff7b72= Ta5d6ff"Ta5d6ffSNTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3setLogsTb4b4b4(
Te6edf3listOfTb4b4b4(
Te6edf3MeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ffmatchTa5d6ff"Tb4b4b4,
Te6edf3message_type Tff7b72= Ta5d6ff"Ta5d6ffTEXTTa5d6ff"Tb4b4b4,
Te6edf3received_date Tff7b72= T79c0ff1Te6edf3_700_000_000_000Tb4b4b4,
Te6edf3raw_message Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3fromNum Tff7b72= Te6edf3senderNodeNumTb4b4b4,
Te6edf3portNum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3fromRadio Tff7b72=
Te6edf3FromRadioTb4b4b4(
Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3from Tff7b72= Te6edf3senderNodeNumTb4b4b4,
Te6edf3rx_snr Tff7b72= T79c0ff5.0fTb4b4b4,
Te6edf3decoded Tff7b72=
Te6edf3DataTb4b4b4(
Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4,
Te6edf3payload Tff7b72= Ta5d6ff"Ta5d6ffHello settingsTa5d6ff"Tb4b4b4.Te6edf3encodeUtf8Tb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3MeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6fffiltered-outTa5d6ff"Tb4b4b4,
Te6edf3message_type Tff7b72= Ta5d6ff"Ta5d6ffRANGETa5d6ff"Tb4b4b4,
Te6edf3received_date Tff7b72= T79c0ff1Te6edf3_700_000_001_000Tb4b4b4,
Te6edf3raw_message Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3fromNum Tff7b72= Te6edf3senderNodeNumTb4b4b4,
Te6edf3portNum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3RANGE_TEST_APPTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3fromRadio Tff7b72=
Te6edf3FromRadioTb4b4b4(
Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3from Tff7b72= Te6edf3senderNodeNumTb4b4b4,
Te6edf3rx_snr Tff7b72= T79c0ff6.0fTb4b4b4,
Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(
Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3RANGE_TEST_APPTb4b4b4,
Te6edf3payload Tff7b72= Ta5d6ff"Ta5d6ffIgnore meTa5d6ff"Tb4b4b4.Te6edf3encodeUtf8Tb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3buffer Tff7b72= Te6edf3BufferTb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3fileServiceTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{ Te6edf3args Tff7b72-Tff7b72>
Tff7b72val Te6edf3block Tff7b72= Te6edf3argsTb4b4b4.Te6edf3argTff7b72<Te6edf3suspend Tb4b4b4(Te6edf3BufferedSinkTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTff7b72>Tb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3blockTb4b4b4(Te6edf3bufferTb4b4b4)
Tff7b72true
Tb4b4b4}
Tff7b72val Te6edf3uri Tff7b72= Te6edf3CommonUriTb4b4b4.Te6edf3parseTb4b4b4(Ta5d6ff"Ta5d6ffcontent://test/export.csvTa5d6ff"Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3saveDataCsvTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3filterPortnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3fileServiceTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3csvOutput Tff7b72= Te6edf3bufferTb4b4b4.Te6edf3readUtf8Tb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3csvOutputTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffdateTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6fftimeTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6fffromTa5d6ff\"Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3csvOutputTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ff123Ta5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffSender NodeTa5d6ff\"Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3csvOutputTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffHello settingsTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3csvOutputTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffIgnore meTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`saveNodeDbJson writes node database export via file service`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setMyNodeInfoTb4b4b4(Te6edf3TestDataFactoryTb4b4b4.Te6edf3createMyNodeInfoTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff4T79c0ff5T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setNodesTb4b4b4(
Te6edf3listOfTb4b4b4(Te6edf3TestDataFactoryTb4b4b4.Te6edf3createTestNodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3longName Tff7b72= Ta5d6ff"Ta5d6ffSender NodeTa5d6ff"Tb4b4b4, Te6edf3shortName Tff7b72= Ta5d6ff"Ta5d6ffSNTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3buffer Tff7b72= Te6edf3BufferTb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3fileServiceTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{ Te6edf3args Tff7b72-Tff7b72>
Tff7b72val Te6edf3block Tff7b72= Te6edf3argsTb4b4b4.Te6edf3argTff7b72<Te6edf3suspend Tb4b4b4(Te6edf3BufferedSinkTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTff7b72>Tb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3blockTb4b4b4(Te6edf3bufferTb4b4b4)
Tff7b72true
Tb4b4b4}
Tff7b72val Te6edf3uri Tff7b72= Te6edf3CommonUriTb4b4b4.Te6edf3parseTb4b4b4(Ta5d6ff"Ta5d6ffcontent://test/nodedb.jsonTa5d6ff"Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3saveNodeDbJsonTb4b4b4(Te6edf3uriTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3fileServiceTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3jsonOutput Tff7b72= Te6edf3bufferTb4b4b4.Te6edf3readUtf8Tb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3jsonOutputTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffschemaVersionTa5d6ff\"Ta5d6ff: 1Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3jsonOutputTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffmyNodeNumTa5d6ff\"Ta5d6ff: 456Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3jsonOutputTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ffnumTa5d6ff\"Ta5d6ff: 123Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3jsonOutputTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6fflongNameTa5d6ff\"Ta5d6ff: Ta5d6ff\"Ta5d6ffSender NodeTa5d6ff\"Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setDbCacheLimit updates manager`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3setDbCacheLimitTb4b4b4(T79c0ff2T79c0ff0T79c0ff0Tb4b4b4)
Te6edf3databaseManagerTb4b4b4.Te6edf3cacheLimitTb4b4b4.Te6edf3value Te6edf3shouldBe T79c0ff1T79c0ff0 T8b949e// Clamped to MAX_CACHE_LIMIT
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.17s